/*
 * Sesame Inc.
 * Copyright (c) 2009 All Rights Reserved.
 */
package com.sesame.toolkit;

import java.security.MessageDigest;
import java.util.HashMap;
import java.util.Map;

/**
 * @author r6c
 * 
 */
public class Encrypt {
    public final static String MD5(String s) {
        char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                'a', 'b', 'c', 'd', 'e', 'f' };
        byte[] strTemp = null;
        byte[] md = null;
        char str[] = null;
        try {
            strTemp = s.getBytes();
            MessageDigest mdTemp = MessageDigest.getInstance("MD5");
            mdTemp.update(strTemp);
            md = mdTemp.digest();
            int j = md.length;
            str = new char[j * 2];
            int k = 0;
            for (int i = 0; i < j; i++) {
                byte byte0 = md[i];
                str[k++] = hexDigits[byte0 >>> 4 & 0xf];
                str[k++] = hexDigits[byte0 & 0xf];
            }
            return new String(str);
        } catch (Exception e) {
            return null;
        }
    }

    public final static String MapEncrypt(String s) {
        Map<Character, Character> map = new HashMap();
        int len = s.length();
        char[] result = new char[len];
        char[] str = new char[len];
        s.getChars(0, len, str, 0);

        map.put('0', '2');
        map.put('1', '8');
        map.put('2', '3');
        map.put('3', '7');
        map.put('4', '0');
        map.put('5', '6');
        map.put('6', 'd');
        map.put('7', '1');
        map.put('8', '4');
        map.put('9', 'a');
        map.put('/', '5');
        map.put('.', '9');
        map.put('_', 'b');
        map.put('-', 'c');
        map.put('l', 'l');
        map.put('m', 'm');
        map.put('s', 's');
        map.put(' ', ' ');

        for (int i = 0; i < len; i++) {
            if (map.get(str[i]) != null) {
                result[i] = map.get(str[i]);
            } else {
                result[i] = ' ';
            }

        }
        return new String(result);
    }

    public final static String MapDecrypt(String s) {
        Map<Character, Character> map = new HashMap();
        int len = s.length();
        char[] result = new char[len];
        char[] str = new char[len];
        s.getChars(0, len, str, 0);

        map.put('2', '0');
        map.put('8', '1');
        map.put('3', '2');
        map.put('7', '3');
        map.put('0', '4');
        map.put('6', '5');
        map.put('d', '6');
        map.put('1', '7');
        map.put('4', '8');
        map.put('a', '9');
        map.put('5', '/');
        map.put('9', '.');
        map.put('b', '_');
        map.put('c', '-');
        map.put('l', 'l');
        map.put('m', 'm');
        map.put('s', 's');
        map.put(' ', ' ');

        for (int i = 0; i < len; i++) {
            if (map.get(str[i]) != null) {
                result[i] = map.get(str[i]);
            } else {
                result[i] = ' ';
            }
        }
        return new String(result);
    }

    public static void main(String[] args) {
        System.out.println(Encrypt.MapEncrypt("0123") + "ya");
        System.out.println(Encrypt.MapDecrypt("0123"));
    }

}